package donkeykong;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class Muelle extends JPanel implements Runnable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/** Variable necesaria para mostrar las animaciones de los sprites del muelle **/
	private int sprite;
	/** Imagenes de los sprites del muelle **/
	private Image muelleEstirado, muelleEncogido, imagenMuelle;
	/** MOVIMIENTO DEL MUELLE, UNIDAD!=0 MUELLE HACE SU MOVIMIENTO, UNIDAD=0, MARIO HA MUERTO **/
	private int UNIDAD = 1;
	/** Variable que indica que este muelle debe sacarse de la lista de muelles activos en la pantalla **/
	private boolean destruir;
	/** Posicion X del muelle **/
	private int posicionX_muelle;
	/** Posicion Y del muelle **/
	private int posicionY_muelle;
	
	private Mario mario;
	
	public Muelle (int posx, int posy, BufferedImage imageFondo, Mario m){
		try {
			setPosicionX(posx);
			setPosicionY(posy);
						
			mario = m;
			destruir=false;
			muelleEncogido = ImageIO.read(new File("./images/muelle/muelle_encogido.png"));
			muelleEstirado = ImageIO.read(new File("./images/muelle/muelle_estirado.png"));
			imagenMuelle = muelleEstirado;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/** Funcion paintComponent que es propia de los JPanels, que sirve para dibujar en el mismo la imagen que se quiera, entre otras opciones **/
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		/** Para hacer operaciones complejas con una imagen, crear un AffineTransform **/
		AffineTransform at = new AffineTransform();
		
		/** Si UNIDAD=0, significa que mario ha muerto, y el muelle ha de quedarse en la ultima posicion y con el ultimo sprite valido **/
		if (UNIDAD!=0){
			imagenMuelle = ((sprite==0)? muelleEstirado: muelleEncogido);
			if (UNIDAD > 0){
				sprite=0;
			}else{
				sprite=1;
			}
			
			
		}
		at.translate(getPosicionX(), getPosicionY()- imagenMuelle.getHeight(null)); 

		g2d.drawImage(imagenMuelle,at,null);
	}
	
	
	
	/** Funcion que sirve para comprobar si el barril choca con Mario **/
	private void comprobarChoque() {
		/** Punto central del barril **/
		int posicion_centro_x = getPosicionX()+ imagenMuelle.getWidth(null)/2 ;
		int posicion_centro_y = getPosicionY()- imagenMuelle.getHeight(null)/2 ;
		
		/** Esquinas de la imagen de Mario **/
		int mario_x_final = mario.getPosicion_x()+mario.getImage().getWidth(null);
		int mario_x_inicial = mario.getPosicion_x();
		int mario_y_final = mario.getPosicion_y();
		int mario_y_inicial = mario.getPosicion_y()-mario.getImage().getHeight(null);
		
		
		/** Si el centro del baril choca con la imagen de Mario, éste muere **/
		if (posicion_centro_x <= mario_x_final & posicion_centro_x >= mario_x_inicial){
			if (posicion_centro_y <= mario_y_final & posicion_centro_y >= mario_y_inicial){
				mario.Muriendo();
			}
		}

		
	}
	
	
	
	/** Funcion para modificar la posicion X del muelle **/
	private void setPosicionX(int posx) {
		posicionX_muelle = posx;
	}

	/** Funcion para modificar la posicion Y del muelle **/
	private void setPosicionY(int posy) {
		posicionY_muelle = posy;
	}
	
	/** 
	 * Devuelve el valor de la posicion Y del muelle 
	 * @return valor de la posicion Y del muelle 
	 */
	private int getPosicionY() {
		return posicionY_muelle;
	}
	
	/** 
	 * Devuelve el valor de la posicion X del muelle 
	 * @return valor de la posicion X del muelle 
	 */
	private int getPosicionX() {
		return posicionX_muelle;
	}
	
	/** Funcion que modifica el valor de UNIDAD a 0 para indicar que Mario ha muerto **/
	public void MarioMuerto(){
		UNIDAD = 0;
	}
	
	/** Funcion que marca el muelle para ser destruido **/
	private void destruirMuelle() {
		destruir = true;
	}
	
	/**
	 * Funcion que comprueba si el muelle debe ser destruido 
	 * @return cierto si el muelle debe ser destruido, falso en caso contrario
	 */
	public boolean isAcabado() {
		return destruir;
	}
	

	@Override
	public void run() {
		// TODO Auto-generated method stub
	try {
		
		//La y desde 105 a 165
		//La x hasta menor de 590
		
	
	if (!mario.isMuriendo() & UNIDAD!=0){
		while ((getPosicionX() < 120)&(getPosicionY() < 165)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+10);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()+6);
			comprobarChoque();
			Thread.sleep(10);
			
		}
		UNIDAD = -UNIDAD;
		Thread.sleep(100);
		UNIDAD = -UNIDAD;
		while ((getPosicionX() < 205)&(getPosicionY() > 105)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+8);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()-6);
			comprobarChoque();
			Thread.sleep(10);
	
		}
		
		while ((getPosicionX() < 300)&(getPosicionY() < 175)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+10);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()+6);
			comprobarChoque();
			Thread.sleep(10);
	
		}
		UNIDAD = -UNIDAD;
		Thread.sleep(100);
		UNIDAD = -UNIDAD;
		while ((getPosicionX() < 430)&(getPosicionY() > 105)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+8);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()-6);
			comprobarChoque();
			Thread.sleep(10);
	
		}
		
		while ((getPosicionX() < 490)&(getPosicionY() < 175)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+10);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()+6);
			comprobarChoque();
			Thread.sleep(10);
	
		}
		UNIDAD = -UNIDAD;
		Thread.sleep(100);
		UNIDAD = -UNIDAD;
		while ((getPosicionX() < 580)&(getPosicionY() > 105)){
			if (UNIDAD==0){
				break;
			}
			Thread.sleep(10);
			setPosicionX(getPosicionX()+8);
			comprobarChoque();
			Thread.sleep(10);
			setPosicionY(getPosicionY()-6);
			comprobarChoque();
			Thread.sleep(10);
	
		}
		
		while ((getPosicionY() < 580)){
			if (UNIDAD==0){
				break;
			}
			setPosicionY(getPosicionY()+6);
			comprobarChoque();
			Thread.sleep(10);
			
		}
		
		if (UNIDAD!=0){
			destruirMuelle();
		}
	}	
			
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		}
	
	}

}
